# 函数的定义 可以进行代码的复用
def sayhi():
    '向大家打招呼'
    print("大家好，我是小明")
    print("今年22岁")
    print("从事Python开发工程师的工作")
    pass
# 调用函数
sayhi()
sayhi()
sayhi()
sayhi()
# 思考？打招呼时，如何因为打招呼的人不同，执行的信息不同？
# 必选参数
def sayHello(name,age,work):
    print("大家好，我是{}".format(name))
    print("我今年{}岁".format(age))
    print("我从事{}".format(work))
    pass
sayHello("tom",25,"运维工程师")
sayHello("tony",28,"人事经理")
sayHello("李逍遥",23,"道人")
# 缺省参数
def sum(a=6,b=8):
    print(a)
    print(b)
    print(a+b)
#     在函数调用中可以传参也可以不传
# 若不传参数，则使用定义时指定的参数默认值
# 若传参，则使用方法调用时传入的参数覆盖参数的默认值
sum(10,20)
# 若设计时，需要必选参数与缺省参数同时存在，则需要将必选参数放在缺省参数的前面
def sub(a,b=2):
    print(a-b)
    pass
# 调用时，必选参数必须要传参，缺省参数可以传也可以不传
sub(10,5)

# 可变参数,默认可以传任意个参数，并将参数封装成一个元祖
def count(*args):
    print(type(args))
    pass
count(1,3,5)
# 思考：利用可变参数，设计一个加法计算器的函数

# 关键字参数 将参数封装在了一个字典中
def getMsg(**kwargs):
    print(type(kwargs))
    pass
# 关键字参数以key value的方式进行传参
getMsg(name="tom",age=26)
dict1={"name":"张三","age":28}
# 若参数传递一个字典类型的数据，需要在参数前面添加**
getMsg(**dict1)

# 若函数设计时，不定长参数与关键字参数同时存在
# 则需要将不定长参数，放在关子健参数前面
def getInfo(*args,**kwargs):
    """
    参数的混合使用
    :param args: 不定长参数
    :param kwargs: 关键字参数
    :return:
    """
    print(args)
    print(kwargs)
    pass
getInfo(1,2,3,4,5,name="tom",age=22)
# 返回值讲解
# 一个函数是否有返回值，由其内部是否有return操作所决定
# 若没有返回值，则打印结果为none
print(sum())
def showReturn():
    return "有返回值"
# 有返回值则会输出返回值的内容
print(showReturn())
# 若返回值有多个，则会将返回值封装在一个元祖中
def showReturn2():
    return 1,2,3,4
print(showReturn2())

# 设计一个计算器，最终返回所有参数的值，以及参数的和
def getSum(*args):
    list1=[]
    result=0
    for i in args:
        list1.append(i)
        result=result+i
        pass
    list1.append(result)
    return list1
print(getSum(1,9,2,8))
# 函数的嵌套
def inner():
    print("第一层函数开始")
    print("第一层函数结束")
    pass
def outter():
    print("第二层函数开始")
    inner()
    print("第二层函数结束")
    pass
outter()